[Day 04] - Vault dynamic secrets engine - AWS


Dynamic Secrets Engine - AWS

簡單操作完 key-value 的存放後,我們來看一下 dynamic engine 的操作,此篇我們使用 AWS 來玩玩。
在操作之前,我們要先確認 vault server 裡已經有 AWS secrets engine。

可以執行 vault secrets list 進行確認,此一指令可以看到已經啟用的 secrets engine 的詳細內容。
如下:

$ vault secrets list

Path           Type         Accessor              Description
----           ----         --------              -----------
cubbyhole/     cubbyhole    cubbyhole_dc16024b    per-token private secret storage
identity/      identity     identity_394049ce     identity store
secret/        kv           kv_9397ee72           key/value secret storage
sys/           system       system_fd0af39a       system endpoints used for control, policy and debugging

從結果可以看出,在 dev mode vault server 啟動的時候,預設會生成三個 secrets engine,分別是:

  • cubbyhole/: 為 cubbyhole 類型的 secrets engine,不能被刪,不能移動,不能啟動多個。
  • identity/: 為 identity 類型的 secrets engine,不能被刪,不能移動。
  • secret/: dev mode 啟動時,會預設產生的 KV secrets engine。

其中的 sys/ 不是 secrets engine ,同樣不能刪除,不能移動,這個路徑跟 vault server 的系統後端有關,用來調整 vault server 的大大小小設定!

那我們就來啟用一個 AWS secrets engine 吧!

Enable a secret engine

進行 secrets engine 的啟用,預設就會增加一個 path 出來,每個 path 之間是獨立且不能互相訪問的。
執行以下的指令,可以在 aws/ 的路徑下,建立一個 aws secrets engine。

$ vault secrets enable -path=aws aws
# 如未帶 path 參數,會直接以 secrets engine 的名字建立。
# 以下指令有相同的效果:
$ vault secrets enable aws

新增完成後,執行 vault secrets list 進行確認,可以看到多了一個 aws/ 的 secrets engine。

$ vault secrets list

Path           Type         Accessor              Description
----           ----         --------              -----------
aws/           aws          aws_16428af2          n/a #沒有設定 Description 的話,會顯示 n/a
cubbyhole/     cubbyhole    cubbyhole_dc16024b    per-token private secret storage
identity/      identity     identity_394049ce     identity store
secret/        kv           kv_9397ee72           key/value secret storage
sys/           system       system_fd0af39a       system endpoints used for control, policy and debugging

AWS secrets engine

在建立完成後,aws secrets engine 需要進行驗證後,才能跟 AWS 進行連線。
此時需要到 AWS 的 IAM 進行建立一組有 IAM 管理權限_(IAMFullAccess)_的 credentials。
讓 vault server 能跟 AWS 進行驗證。

如果權限不足的話在執行時會跳出 error,
Error putting user policy: AccessDenied: XXXXX
status code: 403, request id: 4372feb6-3c27-435c-90f0-4c9f086a25d8

Configure the AWS secrets engine

提供 vault server 的相關的 credential。

$ vault write aws/config/root \
    access_key=<access_key> \
    secret_key=<secret_key> \
    region=us-east-1

Success! Data written to: aws/config/root

Create a role

接下來建立 role,讓 vault server 在 AWS 上建立 IAM users 時,提供 role 所設定的權限。
簡單的來說,這個 role 的權限定義有多大,他在AWS的權限就有多大!
Warning! 下方所設定的 policy ,是 AWS 的設定!不是 vault server 的!
相關的 policy 可以在 AWS官網 上查詢。

$ vault write aws/roles/my-role \
         credential_type=iam_user \
         policy_document=-<<EOF
 {
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "ec2:DescribeInstances",
         "iam:GetInstanceProfile",
         "iam:GetUser",
         "iam:GetRole"
       ],
       "Resource": "*"
     }
   ]
 }
EOF
Success! Data written to: aws/roles/my-role

Generate the secret


上圖的 123 步驟,就已經完成。
接下來的第四步,就是 app 跟 vault 請定一組 credential。
我們可以透過 CLI 來產生:

$ vault read aws/creds/my-role

Key                Value
---                -----
lease_id           aws/creds/my-role/0NNbJwHlU8JkGENsLJyAN2UD
lease_duration     768h
lease_renewable    true
access_key         AKIA6FNTDNMYVKWUJYUB
secret_key         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
security_token     <nil>

上面所拿到的 access_key 跟 secret_key 具有 my-role 所定義的權限唷!

Revoke the secret

用完後不要的話,也可以隨時註銷!

$ vault lease revoke aws/creds/my-role/0NNbJwHlU8JkGENsLJyAN2UD

All revocation operations queued successfully!

Disable a secret engine

已經不需要 secrets engine 的話,也可以直接刪除。
當 secrets engine 被刪除的時候,裡面所有的資料以及設定也會一併被刪除唷!

$ vault secrets disable aws/

Success! Disabled the secrets engine (if it existed) at: aws/

下一篇,我們來試試看 Database 的 dynamic secrets engine 吧!

Reference

#vault







你可能感興趣的文章

For 大家族 for 迴圈、forEach、for...in、for...of 一次搞清楚

For 大家族 for 迴圈、forEach、for...in、for...of 一次搞清楚

DOM 的事件傳遞機制與事件代理

DOM 的事件傳遞機制與事件代理

Jest "Cannot find module from xxx" issue

Jest "Cannot find module from xxx" issue






留言討論